// 接口
interface User{
    name:string;
    age:number;
    id?:number; // 可选属性
    readonly x:number; //只读属性
    readonly y:number; // 只读属性
    say():void; //方法
}

/**
 * 实现接口
 */
class Heyi implements User{
    name:string;
    age:number;
    x=10;
    y=20;
    constructor(name:string,age:number){
        this.name=name;
        this.age=age;
    }

    say():void{
        console.log("hello");
    }
}

// 通过字面量创建对象
const heyi:User={
    name:"heyi",
    age:18,
    x:10,
    y:2,
    say() {
        console.log("hello")
    },
}

/**
 * 接口一般情况下是用来抽象对象的特性的
 * 属性，方法
 * 
 * 使用时有两种途径：直接implements 或者直接作为类型来约束变量
 */

// 一个类 的接口定义
interface PersonInterface{
    name:string,
    age:number,
    speak(n:number):void
}

class Person implements PersonInterface{
    constructor(public name:string,public age:number){}
    speak(n: number): void {
        console.log(`${this.name},${this.age}`)
    }
}
const p1=new Person('hi',12)

// 一个 对象 的接口定义
interface UserInterface{
    name:string,
    readonly gender:string, //只读属性
    age?:number, //可选属性
    run:(n:number)=>void
}

const user:UserInterface={
    name:"张三",
    gender:'na',
    age:18,
    run(n) {
        console.log(`奔跑了${n}`)
    },
}

// 一个 函数 的接口定义
interface CountInterface{
    (a:number,b:number):number;
}

const count:CountInterface=(x,y)=>{
    return x+y;
}

// 接口可以被继承
interface StudentInterface extends PersonInterface{
    grade:string
}

const stu:StudentInterface={
    name:'z',
    age:18,
    grade:'chu2',
    speak(n) {
        console.log(n)
    },
}

// 接口的可合并性
// interface PersonInterface{
//     top:number
// }